package com.virjar.dungproxy.server.core.exception; import com.virjar.dungproxy.server.core.rest.ResponseEnvelope; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.TypeMismatchException; import org.springframework.core.Ordered; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; /** * Created by weijia.deng on 16-4-5. 全局异常处理<br/> controller 外部异常处理,如400,415,找不到controller等, */ public class BadRequestExceptionHandler implements Ordered, HandlerExceptionResolver { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); private static final MappingJackson2JsonView JSON_VIEW = new MappingJackson2JsonView(); private List<Class<?>> filterExceptions = new ArrayList<>(); /** * 导致400的异常,默认处理不会显示字段不匹配的原因 */ public void GlobalExceptionHandler() { filterExceptions.add(TypeMismatchException.class); filterExceptions.add(HttpMessageNotReadableException.class); filterExceptions.add(MissingServletRequestParameterException.class); } @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) { if (!needHandler(ex)) { return null; } logger.error("exception caught!! reason:{}, e:",ex.getMessage(),ex); return buildErrorJson(ex); } private boolean needHandler(Exception ex) { for ( Class<?> clazz : filterExceptions) { if (clazz.isAssignableFrom(ex.getClass())) { return true; } } return false; } private ModelAndView buildErrorPage(Exception ex) { ModelAndView modelAndView=new ModelAndView("forward:/WEB-INF/views/error.jsp"); modelAndView.addObject("message",ex.getMessage()); return modelAndView; } private ModelAndView buildErrorJson(Exception ex) { ModelAndView modelAndView=new ModelAndView(JSON_VIEW); ResponseEnvelope<Object> responseEnvelope=buildResponseEntity(ex); modelAndView.addObject("error",responseEnvelope.getError()); modelAndView.addObject("status",responseEnvelope.isStatus()); modelAndView.addObject("data",responseEnvelope.getData()); return modelAndView; } private ResponseEnvelope<Object> buildResponseEntity(Exception e) { RestApiError restApiError=new RestApiError(); restApiError.setStatusCode("-1"); String localizedMsg=e.getLocalizedMessage(); restApiError.setMessage(localizedMsg); restApiError.setRawMessage(e.getMessage()); ResponseEnvelope<Object> envelope=new ResponseEnvelope<Object>(restApiError,false); return envelope; } public int getOrder() { return 0; } }